from typing import Any
from wsgiref.validate import validator

from .page import Page
from index.sub_array import SubArray

from utils.parser import Parser


class DataItem:
    """数据项（合并后的实现）
    
    """

    # 原实现中的常量
    OF_VALID = 0
    OF_SIZE = 1
    OF_DATA = 3

    def __init__(self, raw: SubArray, page: Page, uid: int, dm: Any):

        self.raw = raw
        self.page = page
        self.uid = uid
        self.dm = dm
        self.old_raw = bytearray(raw.end-raw.start)

    @staticmethod
    def wrap_data_item_raw(raw: bytes) -> bytes:
        """包装原始数据
        格式: [ValidFlag(1)] [DataSize(2)] [Data]
        """
        valid = b'\x00'  # 0表示有效
        size = len(raw).to_bytes(2, 'little')
        return valid + size + raw

    def data(self) -> SubArray:
        """获取数据内容,去掉标识位"""
        return SubArray(
            self.raw.raw, self.raw.start+self.OF_DATA, self.raw.end)
    @classmethod
    def parse_data_item(cls, pg: Page, offset: int, dm: object):
        # 全页面数据
        raw=pg.get_data()
        # dataItem数据大小
        size=Parser.parse_short(raw[offset+cls.OF_SIZE:offset+cls.OF_DATA])
        # 总长
        length=size+cls.OF_DATA
    #     uid计算
        uid=Parser.address_to_uid(Page.get_page_number(pg),offset)

        return cls(SubArray(raw,offset,offset+length),
                   pg,
                   uid,
                   dm)

    def delete(self):
        self.raw.raw[self.raw.start+self.OF_VALID:self.raw.start+self.OF_SIZE]=b'\x01'
        valid=self.raw.raw[self.raw.start+self.OF_VALID:self.raw.start+self.OF_SIZE]
        return self

    def is_valid(self) -> bool:
        """检查数据项是否有效"""
        return Parser.parse_short(self.raw.raw[self.raw.start+self.OF_VALID:self.raw.start+self.OF_SIZE])  == 0

    def before(self) -> None:
        """事务开始前的操作（快照旧值）"""
        pass

    def after(self, xid: int) -> None:
        """事务提交后的操作（写日志）"""
        # 由于消除了实现类，避免强耦合到某个具体 DataManager 类型
        if self.dm and hasattr(self.dm, "log_data_item"):
            self.dm.log_data_item(xid, self)

    def release(self) -> None:
        """释放数据项"""
        self.dm.release_data_item(self)

    def get_uid(self) -> int:
        """获取唯一标识符"""
        return self.uid

    def r_lock(self) -> None:
        """获取读锁
        
        在实际实现中，这里应该获取读锁。
        简化版本中，我们只是提供接口。
        """
        pass
    
    def r_unlock(self) -> None:
        """释放读锁
        
        在实际实现中，这里应该释放读锁。
        简化版本中，我们只是提供接口。
        """
        pass
        
    def un_before(self) -> None:
        """撤销before操作
        
        在事务回滚时调用，恢复到事务开始前的状态
        """
        self.raw = self.old_raw[:]

